const db = require('../db/index')
// 导入加密模块
const bcrypt = require('bcryptjs')
// 导入crypto模块(内置模块) 用于生成UUID
const crypto = require('crypto')
const { accessSync } = require('fs')
const { type } = require('os')
// 导入 fs模块(内置模块) 用于删除文件
fs = require('fs')

/**
 *
 * @param {*} req 前端传入 account image
 * @param {*} res
 * @zs注册新用户的处理函数
 * @zs上传头像(导出)并绑定头像
 */
exports.bindAccount = (req, res) => {
  // 从前端获取账户信息
  const { account } = req.body
  // 生成唯一标识
  const onlyId = crypto.randomUUID()
  // 重命名文件
  let oldName = req.files[0].filename
  // 生成新的文件名
  let newName = Buffer.from(req.files[0].originalname, 'latin1').toString(
    'utf8'
  )
  /** fs.renameSync()方法用于将给定旧路径下的文件同步重命名为给定新路径。如果目标文件已经存在，它将覆盖目标文件。
   * oldPath：它包含必须重命名的文件的路径。它可以是字符串，缓冲区或URL。
   * newPath：它包含必须将文件重命名为的新路径。它可以是字符串，缓冲区或URL。
   */
  fs.renameSync(
    './public/upload/' + oldName,
    './public/upload/' + `${account}` + newName
  )
  // 定义 sql 语句 插入图片信息
  const sql = 'insert into image set ?'
  // 执行 sql 语句 连接数据库
  db.query(
    sql,
    {
      account,
      image_url: `http://127.0.0.1:3007/upload/${account}${newName}`,
      onlyId
    },
    (err, result) => {
      if (err) return res.cc(err)
      // 对账号和头像进行绑定
      const sql = 'update users set imageUrl=? where account=?'
      db.query(
        sql,
        ['http://127.0.0.1:3007/upload/' + newName, account],
        (err, result) => {
          if (err) return res.cc(err)
          // 绑定成功
          res.send({
            status: 0,
            message: '绑定成功'
          })
        }
      ) // 上传头像成功
      // 通过onlyId绑定头像和用户

      res.send({
        onlyId,
        status: 0,
        url: `http://127.0.0.1:3007/upload/${account}${newName}`,
        message: '上传头像成功'
      })
    }
  )
}

/**
 *
 * @param {*} req
 * @param {*} res
 * 获取用户所有的信息的接口
 */
// 获取用户信息 接收参数 id
exports.getUserInfo = (req, res) => {
  const sql = 'select * from users where id = ?'
  db.query(sql, req.body.id, (err, result) => {
    if (err) return res.cc(err)
    result[0].password = ''
    res.send(result[0])
  })
}

// 修改用户信息的接口
exports.updateUserInfo = (req, res) => {
  const result = req.body
  const sql = 'update users set name=?,sex=?,email=? where id=?'
  db.query(
    sql,
    [result.name, result.sex, result.email, result.id],
    (err, result) => {
      if (err) return res.cc(err)
      if (result.affectedRows !== 1) return res.cc('修改用户信息失败')
      res.send({
        status: 0,
        message: '修改用户信息成功'
      })
    }
  )
}

// 修改用户密码的接口
exports.updateUserPassword = (req, res) => {
  const { id, oldpassword, newpassword, nextpassword } = req.body
  // 定义 sql 语句
  // 获取用户信息
  const sql = 'select * from users where id=?'
  // 比对密码信息
  db.query(sql, id, (err, result) => {
    if (err) return res.cc(err)
    if (result.length !== 1) return res.cc('用户不存在')

    // 比对密码
    const compareResult = bcrypt.compareSync(oldpassword, result[0].password)
    if (!compareResult) return res.cc('原密码错误')
    if (oldpassword === newpassword) return res.cc('新密码不能与原密码相同')
    if (newpassword !== nextpassword) return res.cc('两次密码不一致')

    // 定义新密码 加密
    const newPwd = bcrypt.hashSync(newpassword, 10)
    // 定义 sql 语句
    const sql = 'update users set password=? where id=?'
    // 执行 sql 语句
    db.query(sql, [newPwd, id], (err, result) => {
      if (err) return res.cc(err)
      if (result.affectedRows !== 1) return res.cc('修改密码失败')

      res.send({
        status: 0,
        message: '修改密码成功'
      })
    })
  })
}

/**
 *
 * @param {*} req 参数是 account password name sex email department identity
 * @param {*} res
 * @zs 创建管理员的接口
 */

exports.createAdmin = (req, res) => {
  const { account, password, name, sex, email, department, identity } = req.body
  // 定义 sql 语句 ==> 判断当前账号是否存在数据库中
  const sql = 'select * from users where account=?'
  // 执行 sql 语句
  db.query(sql, account, (err, result) => {
    if (err) return res.cc(err)
    if (result.length === 1) return res.cc('该账号已存在')
    // 定义新密码 加密
    const newPwd = bcrypt.hashSync(password, 10)
    // 定义 sql 语句
    const sql = 'insert into users set?'
    const create_time = new Date()
    // 执行 sql 语句
    db.query(
      sql,
      {
        account,
        password: newPwd,
        name,
        sex,
        email,
        department,
        identity,
        create_time,
        status: 0
      },
      (err, result) => {
        if (err) return res.cc(err)
        if (result.affectedRows !== 1) return res.cc('添加管理员失败')
        res.send({
          status: 0,
          message: '添加管理员成功'
        })
      }
    )
  })
}

/**
 *
 * @param {*} req 参数是 identity
 * @param {*} res
 * @zs 获取管理员列表的接口
 */
exports.getAdminList = (req, res) => {
  const sql = 'select * from users where identity=?'
  db.query(sql, req.body.identity, (err, result) => {
    if (err) return res.cc(err)
    res.send(result)
  })
}

/**
 *
 * @param {*} req 参数是 id name sex email department
 * @param {*} res
 * @zs 编辑管理员列表的接口

 * @param {*} res
 * @zs 编辑管理员列表的接口
 */
exports.editAdmin = (req, res) => {
  const { id, name, sex, email, department } = req.body
  const date = new Date()
  const updateContent = {
    id,
    name,
    sex,
    email,
    department,
    update_time: date
  }
  const sql = 'update users set ? where id=?'
  db.query(sql, [updateContent, updateContent.id], (err, result) => {
    if (err) return res.cc(err)
    if (result.affectedRows !== 1) return res.cc('修改管理员信息失败')
    res.send({
      status: 0,
      message: '修改管理员信息成功'
    })
  })
}

/**
 *
 * @param {*} req 参数是 id
 * @param {*} res
 * @zs 管理员赋权为用户的接口
 */
exports.changeIdentityToUser = (req, res) => {
  const identity = '用户'
  const sql = 'update users set identity=? where id=?'
  db.query(sql, [identity, req.body.id], (err, result) => {
    if (err) return res.cc(err)
    if (result.affectedRows !== 1) return res.cc('降级失败')
    res.send({
      status: 0,
      message: '降级成功'
    })
  })
}

exports.changeIdentityToAdmin = (req, res) => {
  const identity = '管理员'
  const sql = 'update users set identity=? where id=?'
  db.query(sql, [identity, req.body.id], (err, result) => {
    if (err) return res.cc(err)
    if (result.affectedRows !== 1) return res.cc('赋权失败')
    res.send({
      status: 0,
      message: '赋权成功'
    })
  })
}

/**
 *
 * @param {*} req 参数是 keyword
 * @param {*} res
 * @zs 搜索用户的接口
 */
exports.searchUsers = (req, res) => {
  const sql = 'select * from users where account like? or name like?'
  db.query(
    sql,
    ['%' + req.body.keyword + '%', '%' + req.body.keyword + '%'],
    (err, result) => {
      if (err) return res.cc(err)
      res.send(result)
    }
  )
}

/**
 *
 * @param {*} req 参数是 id
 * @param {*} res
 * @zs 冻结账号的接口
 */
exports.freezeUser = (req, res) => {
  const status = 1
  const sql = 'update users set status=? where id=?'
  db.query(sql, [status, req.body.id], (err, result) => {
    if (err) return res.cc(err)
    if (result.affectedRows !== 1) return res.cc('冻结失败')
    res.send({
      status: 0,
      message: '冻结成功'
    })
  })
}

/**
 *
 * @param {*} req 参数是 id
 * @param {*} res
 * @zs 解冻账号的接口

 */
exports.unfreezeUser = (req, res) => {
  const status = 0
  const sql = 'update users set status=? where id=?'
  db.query(sql, [status, req.body.id], (err, result) => {
    if (err) return res.cc(err)
    if (result.affectedRows !== 1) return res.cc('解冻失败')
    res.send({
      status: 0,
      message: '解冻成功'
    })
  })
}

/**
 *
 * @param {*} req
 * @param {*} res
 * @zs 获取冻结用户列表的接口
 */
exports.getFreezeUserList = (req, res) => {
  const status = 1
  const sql = 'select * from users where status=?'
  db.query(sql, status, (err, result) => {
    if (err) return res.cc(err)
    res.send(result)
  })
}

/**
 *
 * @param {*} req 参数是 id
 * @param {*} res
 * @zs 删除单个用户的接口
 */
exports.deleteUser = (req, res) => {
  const sql = 'delete from users where id=?'
  db.query(sql, req.body.id, (err, result) => {
    if (err) return res.cc(err)
    if (result.affectedRows !== 1) return res.cc('删除失败')
    res.send({
      status: 0,
      message: '删除成功'
    })
  })
}
